⑴ 怎么用过滤器管理用户session
我们经常会碰到这样的情况,当我们有事情离开了一会,等再回来继续我们在网页中的操作时,会出现session超时的错误,然后跟上一堆的错误,让用户感觉很不爽,像这种情况如果能在一个错误页面给个Session超时的提示就会比较友好些,再一种情况,当一个系统中的用户角色有多个,有些页面对于一些级别低的用户来说是没有权限观看的,可能在页面上能根据不同的权限屏蔽了一些链接让低级别的用户无法进入,但是这只能让低级别的用户看不见高级操作的链接,假如用户知道链接的地址直接在地址栏中输入链接,岂不是也可以进入系统啊,要解决这两个问题就得在页面中做判断了。
If(session== null) {
//如果是超时则跳转到登陆页面重新登陆
}
If(checkAuthority() == false) {
//如果权限不足则跳转到错误页面给个提示
}
每个.jsp页面中加上以上的判断貌似能够解决问题,然而一个系统往往有成百上千的jsp页面,倘若每个页面都这样加岂不是很费事,而且如果将来的权限判断发生变化,将要维护所有的jsp这样的工作量是很大的,灵活性很差,要是在进入这些jsp之前必须统一经过一个地方,在这个地方来做判断貌似要好一下,我们使用了过滤器来解决了这个问题
新建一个过滤器命名为:FilterDemo,该类继承自:javax.servlet.Filter
{
publicvoiddestroy() {}
publicvoiddoFilter(ServletRequest sreq, ServletResponse response,
FilterChain filterChain)
throwsIOException, ServletException {
HttpServletRequest request=(HttpServletRequest)sreq;
HttpSessionsession= request.getSession(false);
if(session==null) {
//如果是session超时,在此处做处理
}
if(request.getRequestURI().endsWith("download.do")) {
//此处可以针对不同的请求根据用户是否具有权限来做处理
}
request.getRequestDispatcher("/Error.jsp").
forward(request,response);
}
publicvoidinit(FilterConfig filterConfig)
throwsServletException {}
}
然后将新建的Filter添加到web.xml中,部署Filter需要添加两部分:
1.filter元素
filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>myPackage.FilterDemo</filter-class>
</filter>
2.filter-mapping元素
filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
以上内容表示所以的请求中以.do结尾的都有首先通过我们这里指定的过滤器:
新建一个Servlet来测试:
{
=1L;
publicDownLoadDemo() {
super();
}
protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {
this.doPost(request, response);
}
protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {
request.getRequestDispatcher("/DownLoadExcel.jsp").
forward(request, response);
}
}
在web.xml中部署好该servlet
<servlet>
<servlet-name>DownLoadDemo</servlet-name>
<servlet-class>com.sinosoft.base.sessiondemo.DownLoadDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownLoadDemo</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
新建jsp来测试
Index.jsp
<body>
<formaction="download.do">
<h1>This is a Demo Application</h1>
<ahref='DownLoadExcel.jsp'>导出Excel</a>
<inputtype='submit'>
</form>
</body>
为了便于对比我们使用了一个是超链接的形式,一个是通过servlet来跳转,当点击提交按钮时会被拦截,而直接点击超链接就不会被拦截,因为我们的Filter中配置的是拦截.do形式的,如果要拦截jsp也可以使用<url-pattern>DownLoadExcel.jsp </url-pattern>
再添加一个错误页面Error.jsp
<body>
<h1>对不起,你没有权限</h1>
</body>
⑵ jsp中过滤器可以拦截请求和响应吗
过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
⑶ jsp和servlet在过滤器中怎么判断前后台
jsp,servlet,过滤器都是服务器端组件,它们的处理逻辑都是在后台执行的。只是回最终生成的结果(通常为答jsp执行后的内容)发给了浏览器显示,如果结果里面包含了javascript,浏览器会执行它。
所以不存在你说的”jsp和servlet在过滤器中怎么判断前后台” 的问题:所有Java代码,不论是jsp、servlet、过滤器都是在后台执行的,它们执行的时候无法知道前端的环境(请求头的user-agent中带的信息除外)。输出的html里面包含的javascript会在前端浏览器中执行。
如果你需要前端相关的信息,如浏览器内核类型等,在后台可以通过request.getHeader("user-agent")来获得。如果需要浏览器窗口大小等相关信息,可以通过javascrtip获取后用ajax等方式发送到后台,但通常不这么做,因为这些信息用户可以随意的改变。
⑷ JSP <a href="">中传递中文的问题
你好啊 ,你学jsp是吧!
你可能还不知道jsp在在传递中文时候会出现乱码
所以说你的图片路径在传递后的路径系统识别不出来了
所以你要么改成英文的,要么解决中文乱码的问题
怎么解决呢?
这有篇文章,你看看,我试过,可以成功
关于JSP中文乱码
JSP文件中乱码现象经常遇到,那如何处理就是我们不可避免的话题,那么该如何解决呢,下面我针对不同的情况,给出几种处理方式:
1) JSP页面中文乱码,这种情况比较好处理,在页面的page指令中加上如下一项就行
<%@ page contentType=”text/html;charset=UTF-8” %>
2) JSP页面采用表单提交时,提交的数据中包含中文,并且提交方式为post这时我们获取表单数据后,展示到其它页面时会出现乱码,解决方案是在获取请求中的参数前,先设置请求的字符集。
如下代码: request.setCharacterEncoding(“UTF-8”) ;
3) 还是表单提交数据,但是提交方式为默认的get方式,这时即使我们设置了请求字符集,但取出来还是乱码,这时需要如下的转换方式,我把转换方式用一个编码转换类来实现了。
/*
* 定义一个转换字符集的工具类CharSetTool
*
* 定义一个方法,用来转换
*/
public class CharSetTool
{
/*
* 方法toUTF8()
* 参数: @inStr 传入要转换的字符串
*/
public static String toUTF8(String inStr)
{
String rtStr="";
if(inStr!=null)
{
try
{
rtStr=new String(inStr.getBytes("ISO-8859-1"),"UTF-8");
}
catch (UnsupportedEncodingException e)
{
//打印错误信息
System.out.println(e.getMessage());
}
}
return rtStr;
}
}
4) URL中文参数乱码处理,
比如:超链接方式
<%
String str="我是中国人";
%>
<a href="next?str=<%=str%>">我是链接,单击可以提交参数</a>
注:next 为 Servlet的URL Pattern
那在将中文作为参数值传递时,首先要把中文字符串进行编码转换,转换成URL格式
操作如下:
<%
String str="我是中国人";
//使用URLEncoder.encode方法
str = URLEncoder.encode(str,"UTF-8");
%>
<a href="next?str=<%=str%>">我是链接,单击可以提交参数</a>
综合以上几种比较常见的JSP中文乱码的处理方式,不管是何种提交方式,我们都可以使用JSP中的过滤器(Filter)来过滤字符编码,下面我就给出一个我自己定义的 “通用”的字集编码过滤器。
/**
* 处理中文字符集的过滤器
*
* @author Administrator
*
*/
public class EncodingFilter implements Filter
{
//过滤器销毁的方法
public void destroy()
{
}
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chan)
throws IOException, ServletException
{
//设置响应模式
response.setContentType("text/html;charset=UTF-8");
//判断客户端的提交方式
if(((HttpServletRequest)request).getMethod().equalsIgnoreCase("POST"))
{
//POST方式提交
//设置请求字符集
request.setCharacterEncoding("UTF-8");
}
else
{
//处理GET
//获取所有的提交参数
Enumeration names = request.getParameterNames();
//遍历
while(names.hasMoreElements())
{
//参数名
String name = (String)names.nextElement();
//因为不知道参数是多值还是单值
String values[] = request.getParameterValues(name);
//循环处理字符集转换
for(int i=0;i<values.length;i++)
{
values[i] = toUTF8(values[i]);
}
}
}
//调用过滤器链中的下一个过滤器
chan.doFilter(request, response);
}
//转换方法(内部私有方法)
private String toUTF8(String str)
{
String rt = null;
try {
if(str!=null)
{
//转换新字符集
rt = new String(str.getBytes("ISO-8859-1"),"UTF-8");
}
} catch (UnsupportedEncodingException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return rt;
}
//初始化方法
public void init(FilterConfig config) throws ServletException
{
}
}
然后在web.xml文件中进行相关的配置 :
<!-- 配置过滤器 -->
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>ocean.mvc.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 匹配所有的请求 -->
</filter-mapping>