栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

短期规划1

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

短期规划1

总结与规划

经过一周的时间,确实经历了不少,日息万变,生活亦是如此,一下是我的近段的新的与下一阶段的规划

心得

在近阶段,得带上自己组的小朋友,得查岗、看签到、看学习进度,确实和自己想象的不一样,觉得应该是非常轻松的,emmm实则不然,自己得往赶,还得催着他们往前赶。怎么说呢,可能是因为刚来学校,整体看起来比较懒散,学习的进度较慢,可能是因为最近活动比较多吧,反正我都捉急,害心态可能不一样。此外呢,在搞这个动态规划,动态规划自己写的时候自己是真的不明白,但是看完题解,觉得就这。。。还是得多联系

规划
  1. 对算法进一步的联系,开始练习其他类型
  2. 对Java基础进行复习
  3. 深入了解Java8底层
  4. 多督促督促小朋友们学习
其他总结- Shiro 整合JWT

因为SpringBoot的安全框架没有学,选了了轻量级的shiro,主要是学起来比较简单,但是在整合JWT的时候问题就出现了,如何用shiro自带的拦截器实现对token进行拦截呢?

引入jwt的依赖

		
            com.auth0
            java-jwt
            3.18.1
        

写一个方法实现AuthenticationToken接口

public class JwtToken implements AuthenticationToken {

    private String token;

    public JwtToken(String token){
        this.token =token;
    }
    @Override
    public Object getPrincipal() {
        return token;
    }

    @Override
    public Object getCredentials() {
        return token;
    }
}

写出自己的拦截器

public class JwtInterceptor extends BasicHttpAuthenticationFilter {
    
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws UnauthorizedException {
        System.out.println("first");
        //判断请求的请求头是否带上 "Token"
        if (isLoginAttempt(request, response)) {
            //如果存在,则进入 executeLogin 方法执行登入,检查 token 是否正确
            try {
                executeLogin(request, response);
                //return true;
            } catch (Exception e) {
                //token 错误
                System.out.println(e);
            }
        }else {
            HttpServletResponse resp= (HttpServletResponse) response;
            HttpServletRequest req= (HttpServletRequest) request;
            try {
                resp.sendRedirect(req.getContextPath()+"/user/badlog");
            } catch (IOException e) {
                System.out.println("未知异常");
            }
            System.out.println("没有token,请先登录");
            return false;
        }
        System.out.println("我是游客");
        //如果请求头不存在 Token,则可能是执行登陆操作或者是游客状态访问,无需检查 token,直接返回 true
        return true;
    }

    
    @Override
    protected boolean isLoginAttempt(ServletRequest request, ServletResponse response) {
        System.out.println("isLoginAttempt");
        HttpServletRequest req = (HttpServletRequest) request;
        String token = req.getHeader("token");
        return token != null;
    }

    
    @Override
    protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
        System.out.println("executeLogin");
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String token = httpServletRequest.getHeader("token");
        JwtToken jwtToken = new JwtToken(token);
        // 提交给realm进行登入,如果错误他会抛出异常并被捕获
        getSubject(request, response).login(jwtToken);
        // 如果没有抛出异常则代表登入成功,返回true
        return true;
    }

    
    @Override
    protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin"));
        httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE");
        httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));
        // 跨域时会首先发送一个option请求,这里我们给option请求直接返回正常状态
        if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
            httpServletResponse.setStatus(HttpStatus.OK.value());
            return false;
        }
        return super.preHandle(request, response);
    }

    
}

将拦截器加入到自己的拦截方法中,并且补齐各种方法

@Configuration
public class shiroConfig {
    @Bean(name = "userRealm")
    public UserRealm userRealm() {
        System.out.println("666666666666666");
        UserRealm realm=new UserRealm();
        return realm;
    }

    @Bean("defaultWebSecurityManager")
    public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //关联realm
        securityManager.setRealm(userRealm);
        //关闭shiro中的session
        DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
        DefaultSessionStorageevaluator defaultSessionStorageevaluator = new DefaultSessionStorageevaluator();
        defaultSessionStorageevaluator.setSessionStorageEnabled(false);
        subjectDAO.setSessionStorageevaluator(defaultSessionStorageevaluator);
        securityManager.setSubjectDAO(subjectDAO);
        return securityManager;

    }

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager) {

        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        factoryBean.setSecurityManager(defaultWebSecurityManager);
        Map filterMap=new linkedHashMap<>();
        filterMap.put("JWT",new JwtInterceptor());
        factoryBean.setFilters(filterMap);
        System.out.println("进入了 shiroFilterFactoryBean");
        Map map=new linkedHashMap<>();
        

        map.put(" /user/a","JWT");
        factoryBean.setFilterChainDefinitionMap(map);
        factoryBean.setLoginUrl("/login.html");
        return factoryBean;
    }
    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){
        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator();
        // 强制使用cglib,防止重复代理和可能引起代理出错的问题
        defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
        return defaultAdvisorAutoProxyCreator;
    }
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager securityManager){
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor=new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }

    @Bean
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

}

再认证的时候一定要记住,最后的return 中不要填写密码而是填写token

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/361696.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号