记录在ssm框架项目中使用拦截器拦截非登录请求遇见的问题

1.使用spring中的filter时,会出现bean注入失败。这个问题一直没解决。

报错原因:web应用启动的顺序是:listener->filter->servlet,而因为项目应用了spring mvc,所以我们会有两个配置文件(applixationContext.xml和springMVC-sevlet.xml),我们在配置spring时会用到spring的listener,它会读取application.xml里的配置对spring context进行初始化;项目启动时,先初始化listener,因此配置在applicationContext.xml里的bean会被初始化和注入;然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化,因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,因为filter初始化时,注解的bean还没初始化,没法注入。

百度上搜 filter无法自动注入,会出现很多解决问题的文章,试了试一直没解决这块先放一下。

2.filter无法使用,我就改用了springmvc的HandlerInterceptorAdapter,在这遇到的问题就是ajax异步请求不能实现页面跳转,然后百度之后解决了。下面把代码贴一下

public class FrontCommonInterceptor extends HandlerInterceptorAdapter{
    
private String[] filterUrl;

@Resource
private UsersService usersService;


@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws ServletException {
 
FrontHelper.frontData( request);
HttpSession session =request.getSession();
/*String token=(String) session.getAttribute("token");
System.out.println(token);*/
String path =request.getRequestURI();
System.out.println("------------"+path);
String type = request.getHeader("X-Requested-With");// XMLHttpRequest
String token=null;
Map<String, Object> map = (Map<String, Object>)((HttpServletRequest) request).getSession().getAttribute("user");
if(map!=null){
token = (String) map.get("token");

}

if (token != null) {

Users result = null;
try {
result = usersService.checkUser(token);
System.out.println("result = " + result);
if (result==null  ) {
session.removeAttribute("token");
session.removeAttribute("user");
token = null;
}
} catch (Exception e1) {
session.removeAttribute("token");
token = null;
}


}

if (token != null) {
if (path.indexOf("/login.html") > -1) {
try {
response.sendRedirect(response.encodeRedirectUrl("caipan-list.html"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
} else {

return true;
}


} else {
if (path.indexOf("/login.html") > -1  || path.indexOf("/login.do") > -1 ) {
return true;

}else{
String path2 = request.getContextPath();
               String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path2 + "/"+ "html/";
if (StringUtils.equals("XMLHttpRequest", type)) {
                   // ajax请求
response.setHeader("REDIRECT", "REDIRECT");
                   response.setHeader("CONTEXTPATH", basePath+"login.html");
                   response.setStatus(HttpServletResponse.SC_FORBIDDEN);//403 禁止
                   return false;
               } else {
                   try {
response.sendRedirect(basePath+"login.html");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
                   return false;
               }
              
}
  
}


}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {

}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {

}
public String[] getFilterUrl() {
return filterUrl;
}
public void setFilterUrl(String[] filterUrl) {
this.filterUrl = filterUrl;
}

   

}

上边是拦截器逻辑代码,下面贴解决跳转的

$.ajaxSetup( {    
        //设置ajax请求结束后的执行动作    
        complete : function(XMLHttpRequest, textStatus) {  
            // 通过XMLHttpRequest取得响应头,REDIRECT    
            var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");//若HEADER中含有REDIRECT说明后端想重定向  
            if (redirect == "REDIRECT") {  
                var win = window;    
                while (win != win.top){  
                    win = win.top;  
                }  
              //将后端重定向的地址取出来,使用win.location.href去实现重定向的要求  
              win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");    
            }  
        }    
    }); 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值