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");
}
}
});