java filter 登陆,Filter实现登陆验证

今天的简历被查看了十份,还是一个hr都没有给我打电话,有一个之前投的给我打电话,但是因为我现在在重庆没有面成。

45384c177c7c

吐槽完毕,分享今日学习心得

对于有些页面,我们必须要求登陆成功以后才能访问,目前接触到三种方式,先来介绍一下使用Filter实现登陆拦截验证

Filter是一个接口,若要自定义一个过滤器,则必须实现Filter接口。为了完成登陆验证,首先自定义一个登陆过滤器:LoginFilter.java

/**

* 登陆过滤器

*

* @author hetiantian

* @version 2017/12/26.

*/

public class LoginFilter implements Filter {

/**

* web应用程序启动时调用此方法,用于初始化该Filter

*

* @param filterConfig 可以从参数中获取初始化参数以及ServletContext信息等

* @throws ServletException

* */

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

/**

* 拦截客户端的请求

*

* @param servletRequest 客户端的请求

* @param servletResponse 服务端的响应

* @param filterChain 传递请求给下一个filter

* @throws ServletException

* @throws IOException

* */

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest)servletRequest;

HttpServletResponse rep = (HttpServletResponse)servletResponse;

//获取session对象

HttpSession session = req.getSession();

//从session对象中获取用户信息

String name = (String)session.getAttribute("name");

System.out.println("name: " + name);

//如果没有登陆,此时session将取不到值,重定向到登录页面

if (name == null || name.equals("")) {

rep.sendRedirect("/login.html");

} else {

//如果已经登陆,继续此次请求

//可以在这里做用户名和密码的验证

filterChain.doFilter(req, rep);

}

}

/**

* web程序关闭时调用此方法,用于销毁一些资源

* */

@Override

public void destroy() {

}

}

在doFilter方法内完成逻辑部分,通过session中的值来判断是否登陆成功,session中的值需要我们自己去实现保存,因此定义了LoginAction类来完成将用户信息保存在session中

LoginAction.java:

/**

* 登陆控制中心

*

* @author hetiantian

* @version 2017/12/26.

*/

public class LoginAction extends HttpServlet {

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("请求分发正确");

String name = request.getParameter("name");

String password = request.getParameter("password");

//将用户信息保存到session中

request.getSession().setAttribute("name", name);

request.getSession().setAttribute("password", password);

//重定向到success_login.html页面中

response.sendRedirect("/success_login.html?request");

}

}

保存成功以后将跳转至/success_login.html,因为我们为这个页面做了拦截(这个拦截由LoginFilter实现)

web.xml文件:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

version="3.1">

LoginAction

com.cqupt.javaweb.LoginAction

LoginAction

/login

login

com.cqupt.javaweb.LoginFilter

login

/success_login.html

在理一下逻辑:

登录页面login.html:里面有用户和密码两个信息,表单提交给LoginAction,在doPost方法里面保存用户信息然后重定向到success_login.html页面。只有登陆成功以后才能访问success_login.html,对success_login.html页面通过LoginFilter做了拦截。

附:login.html

Title

用户:

密码:

success_login.html

Title
登陆成功

在验证结果打印值的时候,出现了乱码情况,于是又定义了一个编码过滤器,字符编码Filter是最常用的Filter之一,在request提交给servlet之前对其指定编码方式。spring中为我们集成了这个过滤器,我们不需要自定义了,只要在web.xml中进行过滤就可以了

编码过滤器: EncodingFilter.java

/**

* 编码过滤器,在request提交到servlet之前对request进行指定的编码方式

*

* @author hetiantian

* @version 2017/12/26.

*/

public class EncodingFilter implements Filter {

private String characterEncoding; //编码方式,配置在web.xml中

@Override

public void init(FilterConfig filterConfig) throws ServletException {

//初始化编码方式

characterEncoding = filterConfig.getInitParameter("characterEncoding");

}

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

//设置request,response的编码方式

if (characterEncoding != null) {

servletRequest.setCharacterEncoding(characterEncoding);

servletResponse.setCharacterEncoding(characterEncoding);

}

filterChain.doFilter(servletRequest, servletResponse);

}

@Override

public void destroy() {

//销毁时清空资源

characterEncoding = null;

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值