⑴ 怎麼用過濾器管理用戶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>