畅购商城:购物车

畅购商城文章系列

畅购商城:分布式文件系统FastDFS
畅购商城:商品的SPU和SKU概念
畅购商城:Lua、OpenResty、Canal实现广告缓存
畅购商城:微服务网关和JWT令牌(上)
畅购商城:微服务网关和JWT令牌(下)
畅购商城:Spring Security Oauth2 JWT(上)
畅购商城:Spring Security Oauth2 JWT(下)
畅购商城:购物车
畅购商城:订单
畅购商城:微信支付
畅购商城:秒杀(上)
畅购商城:秒杀(下)
畅购商城:分布式事务
畅购商城:集群高可用


学习目标

  • 资源服务器授权配置
  • 掌握Oauth认证微服务动态加载数据
  • 掌握购物车流程
  • 掌握购物车渲染流程
  • Oauth2.0认证并获取用户令牌数据
  • 微服务与微服务之间的认证

前言

1. 资源服务器授权配置

1.1 资源服务授权配置

在这里插入图片描述
基本上所有微服务都是资源服务

(1)配置公钥 认证服务生成令牌采用非对称加密算法,认证服务采用私钥加密生成令牌,对外向资源服务提供公钥,资源服务使 用公钥 来校验令牌的合法性。 将公钥拷贝到 public.key文件中,将此文件拷贝到每一个需要的资源服务工程的classpath下 ,例如:用户微服务.

(2)添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

(3)配置每个系统的Http请求路径安全控制策略以及读取公钥信息识别令牌,如下:

@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)//激活方法上的PreAuthorize注解
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
   

    //公钥
    private static final String PUBLIC_KEY = "public.key";

    /***
     * 定义JwtTokenStore
     * @param jwtAccessTokenConverter
     * @return
     */
    @Bean
    public TokenStore tokenStore(JwtAccessTokenConverter jwtAccessTokenConverter) {
   
        return new JwtTokenStore(jwtAccessTokenConverter);
    }

    /***
     * 定义JJwtAccessTokenConverter
     * @return
     */
    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
   
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setVerifierKey(getPubKey());
        return converter;
    }
    /**
     * 获取非对称加密公钥 Key
     * @return 公钥 Key
     */
    private String getPubKey() {
   
        Resource resource = new ClassPathResource(PUBLIC_KEY);
        try {
   
            InputStreamReader inputStreamReader = new InputStreamReader(resource.getInputStream());
            BufferedReader br = new BufferedReader(inputStreamReader);
            return br.lines().collect(Collectors.joining("\n"));
        } catch (IOException ioe) {
   
            return null;
        }
    }

    /***
     * Http安全配置,对每个到达系统的http请求链接进行校验
     * @param http
     * @throws Exception
     */
    @Override
    public void configure(HttpSecurity http) throws Exception {
   
        //所有请求必须认证通过
        http.authorizeRequests()
                //下边的路径放行
                .antMatchers(
                        "/user/add"). //配置地址放行
                permitAll()
                .anyRequest().
                authenticated();    //其他地址需要认证授权
    }
}

1.2 用户微服务资源授权

用户每次访问微服务的时候,需要先申请令牌,令牌申请后,每次将令牌放到头文件中,才能访问微服务。

头文件中每次需要添加一个Authorization头信息,头的结果为bearer token。

将上面生成的公钥public.key拷贝到changgou-service-user微服务工程的resources目录下,

(1)引入依赖

在changgou-service-user微服务工程pom.xml中引入oauth依赖

<!--oauth依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

(2)资源授权配置

在changgou-service-user工程中创建com.changgou.user.config.ResourceServerConfig,代码如下:

@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)//激活方法上的PreAuthorize注解
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
   

    //公钥
    private static final String PUBLIC_KEY = "public.key";

    /***
     * 定义JwtTokenStore
     * @param jwtAccessTokenConverter
     * @return
     */
    @Bean
    public TokenStore tokenStore(JwtAccessTokenConverter jwtAccessTokenConverter) {
   
        return new JwtTokenStore(jwtAccessTokenConverter);
    }

    /***
     * 定义JJwtAccessTokenConverter
     * @return
     */
    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
   
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setVerifierKey(getPubKey());
        return converter;
    }
    /**
     * 获取非对称加密公钥 Key
     * @return 公钥 Key
     */
    private String getPubKey() {
   
        Resource resource = new ClassPathResource(PUBLIC_KEY);
        try {
   
            InputStreamReader inputStreamReader = new InputStreamReader(resource.getInputStream());
            BufferedReader br = new BufferedReader(inputStreamReader);
            return br.lines().collect(Collectors.joining("\n"));
        } catch (IOException ioe) {
   
            return null;
        }
    }

    /***
     * Http安全配置,对每个到达系统的http请求链接进行校验
     * @param http
     * @throws Exception
     */
    @Override
    public void configure(HttpSecurity http) throws Exception {
   
        //所有请求必须认证通过
        http.authorizeRequests()
                //下边的路径放行
                .antMatchers(
                        "/user/add"). //配置地址放行
                permitAll()
                .anyRequest().
                authenticated();    //其他地址需要认证授权
    }
}

2. Oauth对接微服务

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
购物是一个常见的应用场景,可以通过session对象实现。 1.用户添加商品到购物: 当用户点击“添加到购物”按钮时,服务器端获取商品信息并保存到session中。可以使用以下代码: ``` //获取商品信息 String productId = request.getParameter("productId"); String productName = request.getParameter("productName"); double price = Double.parseDouble(request.getParameter("price")); //创建购物项 CartItem item = new CartItem(productId, productName, price, 1); //获取购物对象 Cart cart = (Cart) request.getSession().getAttribute("cart"); if (cart == null) { cart = new Cart(); request.getSession().setAttribute("cart", cart); } //将购物项加入购物 cart.addCartItem(item); ``` 2.用户查看购物: 当用户点击“查看购物”按钮时,服务器端从session中获取购物信息并展示给用户。可以使用以下代码: ``` //获取购物对象 Cart cart = (Cart) request.getSession().getAttribute("cart"); //展示购物信息 if (cart != null) { List<CartItem> itemList = cart.getCartItemList(); for (CartItem item : itemList) { out.println(item.getProductName() + " " + item.getPrice() + " " + item.getQuantity()); } } else { out.println("购物为空"); } ``` 3.用户删除购物项: 当用户点击“删除”按钮时,服务器端从session中获取购物信息并删除对应的购物项。可以使用以下代码: ``` //获取购物对象 Cart cart = (Cart) request.getSession().getAttribute("cart"); //删除购物项 String productId = request.getParameter("productId"); cart.removeCartItem(productId); ``` 通过以上代码,就可以实现基本的购物功能。需要注意的是,购物信息存储在session中,如果用户长时间不操作,session可能会失效,需要考虑session的过期时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值