• shiro 未认证登录统一处理以及碰到的问题记录


    1.shiro 权限未认证,会通过统一的 unauthorized 方法进行拦截,但是自己加了后 ,在自己本地没问题,和h5联调,一直出现跨域的问题。这个问题困扰了我半天,上网后发现好多处理方式。 自己用了这篇文章的可以了。

    https://blog.csdn.net/u010042669/article/details/93308046
    copy下自己的代码以及遇到的问题
    1)添加shiro过滤器
    package com.sq.transportmanage.gateway.api.web.filter;
    
    import org.apache.http.HttpStatus;
    import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
    import org.springframework.stereotype.Component;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * @Author fanht
     * @Description 解决shiro 未认证后cors 跨域同源问题
     * @Date 2020/3/11 下午7:12
     * @Version 1.0
     */
    @Component
    public class CORSFilter extends BasicHttpAuthenticationFilter{
    
        @Override
        protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse res = (HttpServletResponse) response;
            res.setHeader("Access-control-Allow-Origin",req.getHeader("Origin"));
            res.setHeader("Access-Control-Allow-Methods","GET,POST,OPTIONS,PUT,DELETE");
            // 响应首部 Access-Control-Allow-Headers 用于 preflight request (预检请求)中,列出了将会在正式请求的 Access-Control-Expose-Headers 字段中出现的首部信息。修改为请求首部
            res.setHeader("Access-Control-Allow-Headers",req.getHeader("Access-Control-Request-Headers"));
            //给option请求直接返回正常状态
            if(req.getMethod().equals(RequestMethod.OPTIONS.name())){
                res.setStatus(HttpStatus.SC_OK);
                return false;
            }
            return super.preHandle(request, response);
        }
    }

    2.添加后又遇到第二个问题,当请求后 没有认证的情况下,默认的地址是http。网上说的原因是 redirect请求后 header里面的信息清空了,当再次访问时候就出现跨域问题了。 嗯,然后参考了下这篇文章

    https://blog.csdn.net/liqi_q/article/details/99681873 解决了

    附上自己代码

    package com.sq.transportmanage.gateway.api.web.filter;
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.filter.OncePerRequestFilter;
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @Author fanht
     * @Description 解决shiro跳转地址  http变更为https
     * @Date 2020/3/11 下午8:34
     * @Version 1.0
     */
    @Component
    public class AbsoluteSendRedirectFilter extends OncePerRequestFilter {
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            HttpTransWrapper transWrapper = new HttpTransWrapper(request,response);
            filterChain.doFilter(request,transWrapper);
        }
    }
    package com.sq.transportmanage.gateway.api.web.filter;
    
    import org.apache.commons.lang.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    
    /**
     * @Author fanht
     * @Description  http重写为https
     * @Date 2020/3/11 下午8:22
     * @Version 1.0
     */
    @Component
    public class HttpTransWrapper extends HttpServletResponseWrapper{
    
    
        private Logger logger = LoggerFactory.getLogger(this.getClass());
        private final HttpServletRequest request;
    
         /**
         * Constructs a response adaptor wrapping the given response.
         *
         * @param response The response to be wrapped
         * @throws IllegalArgumentException if the response is null
         */
        public HttpTransWrapper(final HttpServletRequest req, HttpServletResponse response) {
            super(response);
            this.request = req;
        }
    
        @Override
        public void sendRedirect(String location) throws IOException {
            if(StringUtils.isEmpty(location)){
                super.sendRedirect(location);
                return;
            }
    
            try {
                final URI uri = new URI(location);
                if(uri.getScheme() != null){
                    super.sendRedirect(location);
                    return;
                }
            } catch (URISyntaxException e) {
                logger.error("=======跳转异常========" + e);
                super.sendRedirect(location);
            }
    
            String finalUrl = "https://" + this.request.getServerName();
            if(request.getServerPort() != 80 && request.getServerPort() != 443 ){
                finalUrl += ":" + request.getServerPort();
            }
            finalUrl += location;
    if(finalUrl.indexOf("localhost") > 0){
    //todo 如果是本地测试 仍然用http的
    super.sendRedirect(location);
    }else{
    super.sendRedirect(finalUrl);
    }
    }
    }

    当然这样子配置后会出现本地启动时候,登录不进来的情况。。。看情况怎么处理下比较合适吧。一般uri里面本机的话有localhost,加个localhost的过滤就行了。。。 如果是localhost 仍然是http...

  • 相关阅读:
    分享两个你可能不知道的Java小秘密
    一次ssl的手动实现——加密算法的简单扫荡
    TCP/IP中最高大上的链路层简介(二)
    与TCP/IP协议的初次见面(一)
    高并发下的九死一生,一个不小心就掉入万丈深渊
    杂谈---一个项目经理的自我反省
    浅谈程序员的行业选择---程序人生
    杂谈---大压力下的工作
    一个有意思的需求——中文匹配度
    杂谈---一个人的两种心理
  • 原文地址:https://www.cnblogs.com/thinkingandworkinghard/p/12465783.html
Copyright © 2020-2023  润新知