1. 程式人生 > >Shiro + SSM(框架) + Freemarker(jsp)

Shiro + SSM(框架) + Freemarker(jsp)

pro debug == 返回 hash ignorecas version token turn

Shiro + SSM(框架) + Freemarker(jsp)講解的權限控制Demo,還不趕快去下載?

我們知道Ajax不能做頁面redirectforward跳轉,所以Ajax請求假如沒登錄,那麽這個請求給用戶的感覺就是沒有任何反應,而用戶又不知道用戶已經退出或是 Session 超時了。這個時候如何解決?

Shiro 教程,Ajax請求攔截跳轉頁面方案

在登錄攔截器中,如我們自己定義的LoginFilter 中,先行判斷下,是否為 Ajax 請求,如果是 Ajax 請求並且沒有相關權限,采用Response 輸出一段 JSON 數據返回即可。

判斷請求是否為Ajax請求

  1. /**
  2. * 是否是Ajax請求
  3. * @param request
  4. * @return
  5. */
  6. public static boolean isAjax(ServletRequest request){
  7. String header = ((HttpServletRequest) request).getHeader("X-Requested-With");
  8. if("XMLHttpRequest".equalsIgnoreCase(header)){
  9. LoggerUtils.debug(CLAZZ, "當前請求為Ajax請求");
  10. return Boolean.TRUE;
  11. }
  12. LoggerUtils.debug(CLAZZ, "當前請求非Ajax請求");
  13. return Boolean.FALSE;
  14. }

Response 輸出JSON數據

  1. /**
  2. * 使用 response 輸出JSON
  3. * @param hresponse
  4. * @param resultMap
  5. * @throws IOException
  6. */
  7. public static void out(ServletResponse response, Map<String, String> resultMap){
  8. PrintWriter out = null;
  9. try {
  10. response.setCharacterEncoding("UTF-8");//設置編碼
  11. response.setContentType("application/json");//設置返回類型
  12. out = response.getWriter();
  13. out.println(JSONObject.fromObject(resultMap).toString());//輸出
  14. } catch (Exception e) {
  15. LoggerUtils.fmtError(CLAZZ, e, "輸出JSON報錯。");
  16. }finally{
  17. if(null != out){
  18. out.flush();
  19. out.close();
  20. }
  21. }
  22. }

Shiro Filter 判斷Ajax 請求並且處理

  1. package com.sojson.core.shiro.filter;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import javax.servlet.ServletRequest;
  5. import javax.servlet.ServletResponse;
  6. import org.apache.shiro.web.filter.AccessControlFilter;
  7. import com.sojson.common.model.UUser;
  8. import com.sojson.common.utils.LoggerUtils;
  9. import com.sojson.core.shiro.CustomShiroSessionDAO;
  10. import com.sojson.core.shiro.token.manager.TokenManager;
  11. /**
  12. *
  13. * <p>
  14. * <p>
  15. * 博客地址:http://www.cnblogs.com/123hll/
  16. * <p>
  17. * <p>
  18. *
  19. * 判斷登錄
  20. *
  21. * <p>
  22. *
  23. * 區分 責任人 日期    說明<br/>
  24. * 創建 Helei 2017年7月2日  <br/>
  25. *
  26. * @author he-lei
  27. * @email [email protected]
  28. * @version 1.0,2017年7月2日 <br/>
  29. *
  30. */
  31. public class LoginFilter extends AccessControlFilter {
  32. final static Class<LoginFilter> CLASS = LoginFilter.class;
  33. // session獲取
  34. CustomShiroSessionDAO customShiroSessionDAO;
  35. @Override
  36. protected boolean isAccessAllowed(ServletRequest request,
  37. ServletResponse response, Object mappedValue) throws Exception {
  38. UUser token = TokenManager.getToken();
  39. if (null != token || isLoginRequest(request, response)) {// &&// isEnabled()
  40. return Boolean.TRUE;
  41. }
  42. if (ShiroFilterUtils.isAjax(request)) {// ajax請求
  43. Map<String, String> resultMap = new HashMap<String, String>();
  44. LoggerUtils.debug(getClass(), "當前用戶沒有登錄,並且是Ajax請求!");
  45. resultMap.put("login_status", "300");
  46. resultMap.put("message",
  47. "\u5F53\u524D\u7528\u6237\u6CA1\u6709\u767B\u5F55\uFF01");// 當前用戶沒有登錄!
  48. ShiroFilterUtils.out(response, resultMap);
  49. }
  50. return Boolean.FALSE;
  51. }
  52. @Override
  53. protected boolean onAccessDenied(ServletRequest request,
  54. ServletResponse response) throws Exception {
  55. // 保存Request和Response 到登錄後的鏈接
  56. saveRequestAndRedirectToLogin(request, response);
  57. return Boolean.FALSE;
  58. }
  59. public void setCustomShiroSessionDAO(
  60. CustomShiroSessionDAO customShiroSessionDAO) {
  61. this.customShiroSessionDAO = customShiroSessionDAO;
  62. }
  63. }

前端Javascript處理Ajax請求返回值

首先提供一個判斷方法:

  1. /**
  2. * 判斷是否登錄,沒登錄刷新當前頁,促使Shiro攔截後跳轉登錄頁
  3. * @param result ajax請求返回的值
  4. * @returns {如果沒登錄,刷新當前頁}
  5. */
  6. function isLogin(result){
  7. if(result && result.login_status && result.login_status == 300){
  8. window.location.reload(true);//刷新當前頁
  9. }
  10. return !0;//返回true
  11. }

然後來一個栗子:

  1. //改變狀態
  2. function changeSessionStatus(sessionIds,status,self){
  3. status = !parseInt(status);
  4. //loading
  5. var load = layer.load();
  6. $.post("${basePath}/member/changeSessionStatus.shtml",{status:status,sessionIds:sessionIds},function(result){
  7. layer.close(load);
  8. if(isLogin(result)){//判斷是否登錄
  9. if(result && result.status == 200){
  10. return self.text(result.sessionStatusText),
  11. self.attr(‘status‘,result.sessionStatus),
  12. self.parent().prev().text(result.sessionStatusTextTd);
  13. layer.msg(‘操作成功‘),!1;
  14. }else{
  15. return layer.msg(result.message,function(){}),!1;
  16. }
  17. }
  18. },‘json‘);
  19. }

Shiro + SSM(框架) + Freemarker(jsp)