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

吐槽完毕,分享今日学习心得
对于有些页面,我们必须要求登陆成功以后才能访问,目前接触到三种方式,先来介绍一下使用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文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
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">
<!--分发登录请求-->
<servlet>
<servlet-name>LoginAction</servlet-name>
<servlet-class>com.cqupt.javaweb.LoginAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginAction</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!--登陆过滤器-->
<filter>
<filter-name>login</filter-name>
<filter-class>com.cqupt.javaweb.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/success_login.html</url-pattern>
</filter-mapping>
</web-app>
在理一下逻辑:
登录页面login.html:里面有用户和密码两个信息,表单提交给LoginAction,在doPost方法里面保存用户信息然后重定向到success_login.html页面。只有登陆成功以后才能访问success_login.html,对success_login.html页面通过LoginFilter做了拦截。
附:login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
用户:<input type="text" name="name"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit" name="提交">
</form>
</body>
</html>
success_login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<center>
<h4>登陆成功</h4>
</center>
</body>
</html>
在验证结果打印值的时候,出现了乱码情况,于是又定义了一个编码过滤器,字符编码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;
}
}
注:这个解决乱码的方式只针对post请求
项目地址:https://github.com/TiantianUpup/javaweb