过滤器强制用户登录 实验内容: 设计一个过滤器,该过滤器有两个功能,一是在web. xml配置过滤器时通过参数encoding指明使用何种字符集编码来获取请求对象的参数,以便对所有请求统一处理表单参数的中文问题;二是不允许未经登录的用户访问站点中的其他任何资源。 实现强制用户登录这一功能的原理是在过滤器中检查session对象中是否保存有用户名以便判断用户是否已登录,如果未经登录而直接访问站点下的任何其他资源,都会强制返回登录页面index.html.
时间: 2024-01-21 14:18:49 浏览: 119
好的,这个实验的目的是为了让你熟悉如何使用过滤器来实现强制用户登录的功能。下面我来解释一下具体的实现原理和步骤。
1. 配置过滤器
首先,你需要在web.xml中配置一个过滤器,用来拦截所有的请求。配置过滤器的方式如下:
```
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.example.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.example.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
```
这里我们配置了两个过滤器:EncodingFilter 和 LoginFilter。EncodingFilter 用来处理表单参数的中文问题,并且通过参数 encoding 指明使用何种字符集编码来获取请求对象的参数。LoginFilter 则用来实现强制用户登录的功能。
2. 实现 EncodingFilter
EncodingFilter 的代码如下:
```
public class EncodingFilter implements Filter {
private String encoding;
public void init(FilterConfig config) throws ServletException {
encoding = config.getInitParameter("encoding");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
public void destroy() {
}
}
```
这个过滤器的作用是将请求的编码设置成 UTF-8。这样可以避免中文乱码的问题。
3. 实现 LoginFilter
LoginFilter 的代码如下:
```
public class LoginFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
HttpSession session = req.getSession(false);
if (session == null || session.getAttribute("username") == null) {
resp.sendRedirect(req.getContextPath() + "/index.html");
} else {
chain.doFilter(request, response);
}
}
public void destroy() {
}
}
```
这个过滤器的作用是检查是否已经登录。如果用户未登录,则强制返回登录页面 index.html。否则,继续执行后续的请求。
4. 编写登录页面
最后,你需要编写一个登录页面 index.html,用来接收用户的登录信息。在登录成功后,将用户名保存到 session 中即可。
```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form method="post" action="login">
<label for="username">Username:</label>
<input type="text" id="username" name="username">
<br>
<label for="password">Password:</label>
<input type="password" id="password" name="password">
<br>
<input type="submit" value="Login">
</form>
</body>
</html>
```
这里我们使用了一个表单,通过 POST 请求将用户名和密码提交到 login servlet 中进行验证。如果验证成功,则将用户名保存到 session 中,然后重定向到首页。
这样,当用户访问站点中的其他资源时,LoginFilter 将会检查 session 中是否保存了用户名。如果没有保存,则强制返回登录页面,否则允许用户访问该资源。
阅读全文