web开发之登录拦截器

我们在进行web开发的时候,通常会限制用户的合法性,即登陆拦截和验证,只是为了保障系统的安全,只将我们规定的个别请求可直接访问,其余的必须经过拦截器来进行验证,那么拦截器到底该怎么写呢?下面就将Spring MVC和JFinal中的登录拦截器的写法记录一下,我们一起进步
Spring MVC中的登录拦截
1.编写登录拦截类

/** * @ClassName: LoginFilter * @author Liu_xg * @date 2018年5月3日 * @Description: TODO 登陆拦截及验证 */ public class LoginFilter implements Filter { private String[] paths; @Override public void destroy() {}@Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; //设置字符集为utf-8 request.setCharacterEncoding("UTF-8"); String path=request.getServletPath(); for (String p : paths) { if (path.equals(p)) { chain.doFilter(request, response); return; } } HttpSession session=request.getSession(); try { String username=(String) session.getAttribute("username"); if(username==null){ //判断session是否为空,为空的话就页面重定向到登陆界面 response.sendRedirect(request.getContextPath()+"/text/index"); return; } } catch (Exception e) { // TODO Auto-generated catch block //判断session是否为空,为空的话就页面重定向到登陆界面 response.sendRedirect(request.getContextPath()+"/text/index"); e.printStackTrace(); return; } chain.doFilter(request, response); }@Override public void init(FilterConfig config) throws ServletException { // 将配置的放行url取出来 paths = config.getInitParameter("excPath").split(","); }}

2.在web.xml中配置不需要拦截的请求
filter com.ftwj.interceptor.LoginFilter excPath/text/index,/text/login,/text/register,/check/loginname, /check/password,/check/pswContain,/user/register filter /*

其中标签中就是不需要拦截的请求
JFinal中的登录拦截
1.编写登录拦截类
/** * @ClassName: LoginInterceptor * @author Liu_xg * @date 2018年5月10日 * @Description: TODO登陆拦截器 */ public class LoginInterceptor implements Interceptor {@Override public void intercept(Invocation inv) { try { //取到session HttpSession session=inv.getController().getSession(); if(session==null){ inv.getController().redirect("/toLogin"); }else{ if(session.getAttribute("user")!=null){ User user=(User) session.getAttribute("user"); if(user!=null){ inv.invoke(); }else{ inv.getController().redirect("/toLogin"); } }else{ inv.getController().redirect("/toLogin"); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); inv.getController().redirect("/toLogin"); } } }

2.将拦截器注册到框架中
/** * 配置路由 * * @param me */ @Override public void configRoute(Routes me) {// 配置拦截器 me.addInterceptor(new LoginInterceptor()); me.add("/", LoginController.class, "/WEB-INF/views/login"); me.add("/main", MainController.class, "/WEB-INF/views/main"); me.add("/menu", MenuController.class, "/WEB-INF/views/menu"); me.add("/user", UserController.class, "/WEB-INF/views/user"); me.add("/role", RoleController.class, "/WEB-INF/views/role"); }

3.设置不需要拦截的请求
1).这种方式是将整个controller都不拦截
/** * @ClassName: LoginController * @author Liu_xg * @date 2018年5月4日 * @Description: TODO 登陆控制器 */@Clear(LoginInterceptor.class) public class LoginController extends Controller { ****** }

【web开发之登录拦截器】2).这种方式是不拦截此方法
/** * 登陆,判断账号和密码是否正确 */ @Clear(LoginInterceptor.class) public void login() { ********* }

    推荐阅读