前提:新的微信端项目。要求是访问的时候需要用户登录。登录需要跳转到微信Auth2.0去获取用户信息。
一般登录拦截的操作都是在applicationContext.xml配置一个拦截器。如下面这样
在这个拦截器中要求用户登录(存在session中)。
if(session.getAttribute("loginproperties") == null){
response.sendRedirect(StringUtil.authUrl(request.getScheme()+"://"+request.getServerName()+request.getRequestURI()));
return false;
}
但是现在有个问题是,我们的拦截都是进了DispatcherServlet,如果需要在html这种静态资源之前增加权限拦截,那么有个很蛋疼的事情就是,因为springMVC会根据你的链接去动态匹配对应的handler,如果你需要跳转到不同的静态页面,那么你每写一个静态页面,就需要增加一个跳转,
return "/test/a" ;
这样既繁琐,又增加了服务器的压力。那有没有方法可以不进入dispatchServlet,但是可以对静态页面进行拦截,当没有权限访问的时候,要求用户登录呢?
答案是有的。
就是过滤器。
package com.common.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.filter.OncePerRequestFilter;
import com.common.util.StringUtil;
/**
* Servlet Filter implementation class LoginFilter
*/
public class LoginFilter extends OncePerRequestFilter {
/**
* Default constructor.
*/
public LoginFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
// pass the request along the filter chain
System.out.println("come hiere");
HttpSession session = request.getSession();
if(null==session.getAttribute("openid")&&(null==request.getParameter("code")||"".equals(request.getParameter("code").trim())))
{ response.sendRedirect(StringUtil.authUrl(request.getScheme()+"://"+request.getServerName()+request.getRequestURI()));
return;
}
chain.doFilter(request, response);
}
}
然后在web.xml中配置
就可以在访问每一个html文件之前,要求用户先登录,且无需进入到dispathServlet中折腾了。