- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章javaweb中Filter(过滤器)的常见应用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、统一全站字符编码 。
通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
package
me.gacl.web.filter;
import
java.io.IOException;
import
javax.servlet.Filter;
import
javax.servlet.FilterChain;
import
javax.servlet.FilterConfig;
import
javax.servlet.ServletException;
import
javax.servlet.ServletRequest;
import
javax.servlet.ServletResponse;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletRequestWrapper;
import
javax.servlet.http.HttpServletResponse;
/**
* @ClassName: CharacterEncodingFilter
* @Description: 此过滤器用来解决全站中文乱码问题
*/
public
class
CharacterEncodingFilter
implements
Filter {
private
FilterConfig filterConfig =
null
;
//设置默认的字符编码
private
String defaultCharset =
"UTF-8"
;
public
void
doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain)
throws
IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String charset = filterConfig.getInitParameter(
"charset"
);
if
(charset==
null
){
charset = defaultCharset;
}
request.setCharacterEncoding(charset);
response.setCharacterEncoding(charset);
response.setContentType(
"text/html;charset="
+charset);
MyCharacterEncodingRequest requestWrapper =
new
MyCharacterEncodingRequest(request);
chain.doFilter(requestWrapper, response);
}
public
void
init(FilterConfig filterConfig)
throws
ServletException {
//得到过滤器的初始化配置信息
this
.filterConfig = filterConfig;
}
public
void
destroy() {
}
}
/*
1.实现与被增强对象相同的接口
2、定义一个变量记住被增强对象
3、定义一个构造器,接收被增强对象
4、覆盖需要增强的方法
5、对于不想增强的方法,直接调用被增强对象(目标对象)的方法
*/
class MyCharacterEncodingRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
public MyCharacterEncodingRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
/* 重写getParameter方法
* @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)
*/
@Override
public
String getParameter(String name) {
try
{
//获取参数的值
String value=
this
.request.getParameter(name);
if
(value==
null
){
return
null
;
}
//如果不是以get方式提交数据的,就直接返回获取到的值
if
(!
this
.request.getMethod().equalsIgnoreCase(
"get"
)) {
return
value;
}
else
{
//如果是以get方式提交数据的,就对获取到的值进行转码处理
value =
new
String(value.getBytes(
"ISO8859-1"
),
this
.request.getCharacterEncoding());
return
value;
}
}
catch
(Exception e) {
throw
new
RuntimeException(e);
}
}
}
|
web.xml文件中的配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<
filter
>
<
filter-name
>CharacterEncodingFilter</
filter-name
>
<
filter-class
>me.gacl.web.filter.CharacterEncodingFilter</
filter-class
>
<
init-param
>
<
param-name
>charset</
param-name
>
<
param-value
>UTF-8</
param-value
>
</
init-param
>
</
filter
>
<
filter-mapping
>
<
filter-name
>CharacterEncodingFilter</
filter-name
>
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
|
2、禁止浏览器缓存所有动态页面 有3 个HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:
并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头.
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
package
me.gacl.web.filter;
import
java.io.IOException;
import
javax.servlet.Filter;
import
javax.servlet.FilterChain;
import
javax.servlet.FilterConfig;
import
javax.servlet.ServletException;
import
javax.servlet.ServletRequest;
import
javax.servlet.ServletResponse;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
/**
* @ClassName: NoCacheFilter
* @Description: 禁止浏览器缓存所有动态页面
* @author: 孤傲苍狼
* @date: 2014-8-31 下午11:25:40
*
*/
public
class
NoCacheFilter
implements
Filter {
public
void
doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain)
throws
IOException, ServletException {
//把ServletRequest强转成HttpServletRequest
HttpServletRequest request = (HttpServletRequest) req;
//把ServletResponse强转成HttpServletResponse
HttpServletResponse response = (HttpServletResponse) resp;
//禁止浏览器缓存所有动态页面
response.setDateHeader(
"Expires"
, -
1
);
response.setHeader(
"Cache-Control"
,
"no-cache"
);
response.setHeader(
"Pragma"
,
"no-cache"
);
chain.doFilter(request, response);
}
public
void
init(FilterConfig filterConfig)
throws
ServletException {
}
public
void
destroy() {
}
}
|
web.xml文件中的配置如下:
1
2
3
4
5
6
7
8
9
10
|
<
filter
>
<
filter-name
>NoCacheFilter</
filter-name
>
<
filter-class
>me.gacl.web.filter.NoCacheFilter</
filter-class
>
</
filter
>
<
filter-mapping
>
<
filter-name
>NoCacheFilter</
filter-name
>
<!--只拦截Jsp请求-->
<
servlet-name
>*.jsp</
servlet-name
>
</
filter-mapping
>
|
3、控制浏览器缓存页面中的静态资源 。
有些动态页面中引用了一些图片或css文件以修饰页面效果,这些图片和css文件经常是不变化的,所以为减轻服务器的压力,可以使用filter控制浏览器缓存这些文件,以提升服务器的性能.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
package
me.gacl.web.filter;
import
java.io.IOException;
import
javax.servlet.Filter;
import
javax.servlet.FilterChain;
import
javax.servlet.FilterConfig;
import
javax.servlet.ServletException;
import
javax.servlet.ServletRequest;
import
javax.servlet.ServletResponse;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
/**
* @ClassName: CacheFilter
* @Description: 控制缓存的filter
*/
public
class
CacheFilter
implements
Filter {
private
FilterConfig filterConfig;
public
void
doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain)
throws
IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//1.获取用户想访问的资源
String uri = request.getRequestURI();
//2.得到用户想访问的资源的后缀名
String ext = uri.substring(uri.lastIndexOf(
"."
)+
1
);
//得到资源需要缓存的时间
String time = filterConfig.getInitParameter(ext);
if
(time!=
null
){
long
t = Long.parseLong(time)*
3600
*
1000
;
//设置缓存
response.setDateHeader(
"expires"
, System.currentTimeMillis() + t);
}
chain.doFilter(request, response);
}
public
void
init(FilterConfig filterConfig)
throws
ServletException {
this
.filterConfig = filterConfig;
}
public
void
destroy() {
}
}
|
web.xml文件中的配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<!-- 配置缓存过滤器 -->
<
filter
>
<
filter-name
>CacheFilter</
filter-name
>
<
filter-class
>me.gacl.web.filter.CacheFilter</
filter-class
>
<!-- 配置要缓存的web资源以及缓存时间,以小时为单位 -->
<
init-param
>
<
param-name
>css</
param-name
>
<
param-value
>4</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>jpg</
param-name
>
<
param-value
>1</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>js</
param-name
>
<
param-value
>4</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>png</
param-name
>
<
param-value
>4</
param-value
>
</
init-param
>
</
filter
>
<!-- 配置要缓存的web资源的后缀-->
<
filter-mapping
>
<
filter-name
>CacheFilter</
filter-name
>
<
url-pattern
>*.jpg</
url-pattern
>
</
filter-mapping
>
<
filter-mapping
>
<
filter-name
>CacheFilter</
filter-name
>
<
url-pattern
>*.css</
url-pattern
>
</
filter-mapping
>
<
filter-mapping
>
<
filter-name
>CacheFilter</
filter-name
>
<
url-pattern
>*.js</
url-pattern
>
</
filter-mapping
>
<
filter-mapping
>
<
filter-name
>CacheFilter</
filter-name
>
<
url-pattern
>*.png</
url-pattern
>
</
filter-mapping
>
|
4、实现用户自动登陆 。
思路是这样的:
1、在用户登陆成功后,发送一个名称为user的cookie给客户端,cookie的值为用户名和md5加密后的密码。 2、编写一个AutoLoginFilter,这个filter检查用户是否带有名称为user的cookie来,如果有,则调用dao查询cookie的用户名和密码是否和数据库匹配,匹配则向session中存入user对象(即用户登陆标记),以实现程序完成自动登陆.
核心代码如下:
处理用户登录的控制器:LoginServlet 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
package
me.gacl.web.controller;
import
java.io.IOException;
import
javax.servlet.ServletException;
import
javax.servlet.http.Cookie;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
me.gacl.dao.UserDao;
import
me.gacl.domain.User;
import
me.gacl.util.WebUtils;
public
class
LoginServlet
extends
HttpServlet {
public
void
doGet(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
String username = request.getParameter(
"username"
);
String password = request.getParameter(
"password"
);
UserDao dao =
new
UserDao();
User user = dao.find(username, password);
if
(user==
null
){
request.setAttribute(
"message"
,
"用户名或密码不对!!"
);
request.getRequestDispatcher(
"/message.jsp"
).forward(request, response);
return
;
}
request.getSession().setAttribute(
"user"
, user);
//发送自动登陆cookie给客户端浏览器进行存储
sendAutoLoginCookie(request,response,user);
request.getRequestDispatcher(
"/index.jsp"
).forward(request, response);
}
/**
* @Method: sendAutoLoginCookie
* @Description: 发送自动登录cookie给客户端浏览器
* @param request
* @param response
* @param user
*/
private
void
sendAutoLoginCookie(HttpServletRequest request, HttpServletResponse response, User user) {
if
(request.getParameter(
"logintime"
)!=
null
) {
int
logintime = Integer.parseInt(request.getParameter(
"logintime"
));
//创建cookie,cookie的名字是autologin,值是用户登录的用户名和密码,用户名和密码之间使用.进行分割,密码经过md5加密处理
Cookie cookie =
new
Cookie(
"autologin"
,user.getUsername() +
"."
+ WebUtils.md5(user.getPassword()));
//设置cookie的有效期
cookie.setMaxAge(logintime);
//设置cookie的有效路径
cookie.setPath(request.getContextPath());
//将cookie写入到客户端浏览器
response.addCookie(cookie);
}
}
public
void
doPost(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
doGet(request, response);
}
}
|
处理用户自动登录的过滤器:AutoLoginFilter 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
package
me.gacl.web.filter;
import
java.io.IOException;
import
javax.servlet.Filter;
import
javax.servlet.FilterChain;
import
javax.servlet.FilterConfig;
import
javax.servlet.ServletException;
import
javax.servlet.ServletRequest;
import
javax.servlet.ServletResponse;
import
javax.servlet.http.Cookie;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
me.gacl.dao.UserDao;
import
me.gacl.domain.User;
import
me.gacl.util.WebUtils;
public
class
AutoLoginFilter
implements
Filter {
public
void
doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain)
throws
IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//如果已经登录了,就直接chain.doFilter(request, response)放行
if
(request.getSession().getAttribute(
"user"
)!=
null
){
chain.doFilter(request, response);
return
;
}
//1.得到用户带过来的authlogin的cookie
String value =
null
;
Cookie cookies[] = request.getCookies();
for
(
int
i=
0
;cookies!=
null
&& i<cookies.length;i++){
if
(cookies[i].getName().equals(
"autologin"
)){
value = cookies[i].getValue();
}
}
//2.得到 cookie中的用户名和密码
if
(value!=
null
){
String username = value.split(
"\\."
)[
0
];
String password = value.split(
"\\."
)[
1
];
//3.调用dao获取用户对应的密码
UserDao dao =
new
UserDao();
User user = dao.find(username);
String dbpassword = user.getPassword();
//4.检查用户带过来的md5的密码和数据库中的密码是否匹配,如匹配则自动登陆
if
(password.equals(WebUtils.md5(dbpassword))){
request.getSession().setAttribute(
"user"
, user);
}
}
chain.doFilter(request, response);
}
public
void
destroy() {
}
public
void
init(FilterConfig filterConfig)
throws
ServletException {
}
}
|
如果想取消自动登录,那么可以在用户注销时删除自动登录cookie,核心代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
package
me.gacl.web.controller;
import
java.io.IOException;
import
javax.servlet.ServletException;
import
javax.servlet.http.Cookie;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
public
class
CancelAutoLoginServlet
extends
HttpServlet {
public
void
doGet(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
//移除存储在session中的user
request.getSession().removeAttribute(
"user"
);
//移除自动登录的cookie
removeAutoLoginCookie(request,response);
//注销用户后跳转到登录页面
request.getRequestDispatcher(
"/login.jsp"
).forward(request, response);
}
/**
* @Method: removeAutoLoginCookie
* @Description: 删除自动登录cookie,
* JavaWeb中删除cookie的方式就是新创建一个cookie,新创建的cookie与要删除的cookie同名,
* 设置新创建的cookie的cookie的有效期设置为0,有效路径与要删除的cookie的有效路径相同
* @param request
* @param response
*/
private
void
removeAutoLoginCookie(HttpServletRequest request, HttpServletResponse response) {
//创建一个名字为autologin的cookie
Cookie cookie =
new
Cookie(
"autologin"
,
""
);
//将cookie的有效期设置为0,命令浏览器删除该cookie
cookie.setMaxAge(
0
);
//设置要删除的cookie的path
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
}
public
void
doPost(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
doGet(request, response);
}
}
|
以上就是过滤器的几个常见应用场景,希望对大家的学习有所帮助.
最后此篇关于javaweb中Filter(过滤器)的常见应用的文章就讲到这里了,如果你想了解更多关于javaweb中Filter(过滤器)的常见应用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我应该在 Angular 应用程序中使用哪个,为什么? array.filter(o => o.name === myName); 或 $filter('filter')(array, {name:
以下两个调用是否解析为 Django 中的等效 SQL 查询? 链接多个调用 Model.objects \ .filter(arg1=foo) \ .filter(arg2=bar) \ ... 将
我正在尝试在 hbase-1.0.0 上运行 completebulkload。但是遇到错误, "java.lang.NoClassDefFoundError: org/apache/hadoop/h
我从这篇文章中学习了“树”和“索引”:Learning Git Internals by Example 但是当谈到“git filter-branch”命令时,我不知道“--tree-filter”
我正在尝试构建我的自定义过滤器以进行身份验证,但是当我尝试运行我的 WebAPI 解决方案时遇到了这个问题: The given filter instance must implement on
我想保留一个过滤器函数的列表,并通过返回true的过滤器来标记这些项。这是接近但不完全。。主要问题是std::stringify!总是返回“ADF”,可能是我声明为ADF的变量名。。第二个问题是,在定
我想保留一个筛选器函数列表,并通过返回True的筛选器来标记这些项目。这已经很接近了,但还不完全是。。主要问题是std::stringify!总是返回“ADF”,可能是我声明为ADF的变量名。。第二个
我尝试在 graphql 查询中使用 where: filter 但不幸的是我遇到了一些错误。我做错了什么? shoeposts { data { attributes(where: {s
几周以来,我一直在使用 Zend Framework 2,尽管在线文档非常不完整,但我还是设法建立了我的网站的初稿。 不幸的是,我在尝试实现 Zend\Filter\File\Rename 过滤器的自
我正在尝试在 APC 中使用 apc.filter 等功能。但是我所做的一切都不起作用 我应该完成 2 项任务。 1)需要包含1个目录用于缓存。我的代码在apc.ini apc.cache by de
我想使用一个可能返回 Err 的过滤器函数结果,并将其冒泡到包含函数: mycoll.into_iter() .filter(|el| { if el == "bad" { E
每个 Controller 都应该有方法filters(),在那里你可以指定一些类,我想知道,这些类是如何被框架包含的?这些类是如何配置的,以及何时配置,也许有人可以给我一个使用filters()并包
我想在一维信号上使用巴特沃斯滤波器。在 Matlab 中,脚本如下所示: f=100; f_cutoff = 20; fnorm =f_cutoff/(f/2); [b,a] = butter
我想比较两个列表,以便找到第一个列表中不在第二个列表中的值并返回它们。提前谢谢大家代码返回:不再支持过滤器有没有其他方法可以做到这一点 MATCH (cu:Customer{name: "myCust
在 Android 应用程序中,我有一个通用设置 -- 一个带有 ArrayAdapter 的 ListView。在某一时刻,我调用了适配器的 getFilter().filter() 方法,它很好地
所以我有如下数据: [ { "id": 0, "title": "happy dayys", "owner": {"id": "1", "username
阅读Mastering Web Development with AngularJS ,我正在尝试创建并使用一个使用 $filter 模块/关键字的新过滤器。 HTML
所以我的理解是 halt 命令应该停止当前过滤器中的请求,但它似乎继续。下面是一个非常简单的 Sinatra 应用程序,演示了这一点。 服务器.rb require 'sinatra' before
我正在尝试将散列传递给 URL 以设置 UIkit 过滤器。 All
我正在使用 django-filter应用程序。但是有一个问题我不知道如何解决。它几乎与 django 文档中描述的完全相同: https://docs.djangoproject.com/en/1.
我是一名优秀的程序员,十分优秀!